### 思路：
### 一、对于方管与圆管、根据均匀壁厚确认草图面与拉伸方向
###          - 1.计算内外环是否符合offset距离
###          - 2.判断符合的内外环所在的面，是否只有两个
###          - 3.增加法向相反判定，只留下一对。
### 二、确认顶面，底面，对顶面与底面设置为切割面，并为切割面寻找外部wire，并设置为刀路
### 三、确认侧面，并区分为外侧面与内侧面，找出内侧面
### 四、根据内侧面提取出内环的wire，将内环的wire设置为刀路
### 综上，可以获得所有刀路


### todo：未来需考虑工字钢，可以根据形状来判定拉伸方向
### todo：针对开形wire，比如跨面孔，需要进行特殊处理



from OCC.Core.BRep import BRep_Tool
from OCC.Core.BRepAdaptor import BRepAdaptor_Surface
from OCC.Core.BRepAlgoAPI import BRepAlgoAPI_Section
from OCC.Core.BRepBuilderAPI import BRepBuilderAPI_MakeEdge
from OCC.Core.BRepFill import BRepFill_Filling
from OCC.Core.BRepOffsetAPI import BRepOffsetAPI_MakeOffset, BRepOffsetAPI_MakeOffsetShape
from OCC.Core.TopoDS import topods, TopoDS_Compound
from OCC.Core.TopExp import TopExp_Explorer
from OCC.Core.TopAbs import TopAbs_FACE, TopAbs_EDGE, TopAbs_WIRE
from OCC.Core.gp import gp_Pnt

from OCC.Extend.DataExchange import read_iges_file
from OCC.Display.SimpleGui import init_display
from OCC.Display.OCCViewer import rgb_color
# from OCC.Display.OCCViewer import color_to_name

# 加载零件模型文件
part = read_iges_file("assets/recognize/0109.IGS")  # 替换为你的零件模型文件路径

# 提取孔洞线
hole_wires = []

# 获取所有边界线
wire_explorer = TopExp_Explorer(part, TopAbs_WIRE)
while wire_explorer.More():
    wire = topods.Wire(wire_explorer.Current())
    hole_wires.append(wire)
    wire_explorer.Next()

# 初始化3D视图
display, start_display, add_menu, add_function_to_menu = init_display()



# 在3D视图中显示零件模型
display.DisplayShape(part)

# 在3D视图中高亮显示孔洞线
for wire in hole_wires:
    display.DisplayShape(wire, color=rgb_color(0,1,0))

# 显示3D视图
start_display()